Possibly fix bug #13086 with losing track of subprocesses on MS-Windows.
authorEli Zaretskii <eliz@gnu.org>
Fri, 21 Dec 2012 11:21:35 +0000 (13:21 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 21 Dec 2012 11:21:35 +0000 (13:21 +0200)
 src/w32proc.c (new_child, delete_child, find_child_pid): For a
 subprocess, consider its slot being in use as long as its process
 handle (procinfo.hProcess) is not NULL.  This avoids reusing the
 slot when a new process is started immediately after killing
 another one, without waiting enough time for the first process to
 be reaped and resources allocated for it be orderly freed.
 Suggested by Fabrice Popineau <fabrice.popineau@supelec.fr>.

src/ChangeLog
src/w32proc.c

index b98d783515794929629b53958cc785ff4f697509..2ffe7e8f4af829430cd20086a59f98e68a461d78 100644 (file)
@@ -1,3 +1,14 @@
+2012-12-21  Eli Zaretskii  <eliz@gnu.org>
+
+       * w32proc.c (new_child, delete_child, find_child_pid): For a
+       subprocess, consider its slot being in use as long as its process
+       handle (procinfo.hProcess) is not NULL.  This avoids reusing the
+       slot when a new process is started immediately after killing
+       another one, without waiting enough time for the first process to
+       be reaped and resources allocated for it be orderly freed.
+       (Bug#13086)
+       Suggested by Fabrice Popineau <fabrice.popineau@supelec.fr>.
+
 2012-12-21  Chong Yidong  <cyd@gnu.org>
 
        * buffer.c (Fset_buffer_major_mode): Doc fix (Bug#13231).
index e3c54fe54600e584df85d50d2d922d6b9fa4f431..03360075a09e109e23ffcbf767be3fd0eb2181bc 100644 (file)
@@ -795,7 +795,7 @@ new_child (void)
   DWORD id;
 
   for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
-    if (!CHILD_ACTIVE (cp))
+    if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess == NULL)
       goto Initialize;
   if (child_proc_count == MAX_CHILDREN)
     return NULL;
@@ -852,7 +852,7 @@ delete_child (child_process *cp)
     if (fd_info[i].cp == cp)
       emacs_abort ();
 
-  if (!CHILD_ACTIVE (cp))
+  if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess == NULL)
     return;
 
   /* reap thread if necessary */
@@ -896,7 +896,8 @@ delete_child (child_process *cp)
   if (cp == child_procs + child_proc_count - 1)
     {
       for (i = child_proc_count-1; i >= 0; i--)
-       if (CHILD_ACTIVE (&child_procs[i]))
+       if (CHILD_ACTIVE (&child_procs[i])
+           || child_procs[i].procinfo.hProcess != NULL)
          {
            child_proc_count = i + 1;
            break;
@@ -913,7 +914,8 @@ find_child_pid (DWORD pid)
   child_process *cp;
 
   for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
-    if (CHILD_ACTIVE (cp) && pid == cp->pid)
+    if ((CHILD_ACTIVE (cp) || cp->procinfo.hProcess != NULL)
+       && pid == cp->pid)
       return cp;
   return NULL;
 }